// src/utils/deviceUtils.ts

/**
 * 设备工具类 - 提供设备相关的公共方法
 */

/**
 * 根据 deviceCode 在设备树中查找设备名称
 * @param deviceCode 设备代码
 * @param treeData 设备树数据
 * @returns 设备名称，如果找不到返回空字符串
 */
export const getDeviceNameByCode = (deviceCode: string, treeData: any[]): string => {
  if (!deviceCode || !treeData || treeData.length === 0) {
    return '';
  }

  // 递归查找设备名称
  const findDevice = (nodes: any[]): string => {
    for (const node of nodes) {
      if (node.deviceCode === deviceCode) {
        return node.deviceName || '';
      }
      if (node.children && node.children.length > 0) {
        const result = findDevice(node.children);
        if (result) return result;
      }
    }
    return '';
  };

  return findDevice(treeData);
};

/**
 * 根据 deviceCode 在设备树中查找完整的设备信息
 * @param deviceCode 设备代码
 * @param treeData 设备树数据
 * @returns 完整的设备信息对象，如果找不到返回 null
 */
export const getDeviceInfoByCode = (deviceCode: string, treeData: any[]): any => {
  if (!deviceCode || !treeData || treeData.length === 0) {
    return null;
  }

  // 递归查找设备信息
  const findDevice = (nodes: any[]): any => {
    for (const node of nodes) {
      if (node.deviceCode === deviceCode) {
        return node;
      }
      if (node.children && node.children.length > 0) {
        const result = findDevice(node.children);
        if (result) return result;
      }
    }
    return null;
  };

  return findDevice(treeData);
};

/**
 * 扁平化设备树数据，便于快速查找
 * @param treeData 设备树数据
 * @returns 扁平化的设备映射 { deviceCode: deviceName }
 */
export const flattenDeviceTree = (treeData: any[]): Record<string, string> => {
  const result: Record<string, string> = {};

  const flatten = (nodes: any[]) => {
    for (const node of nodes) {
      if (node.deviceCode) {
        result[node.deviceCode] = node.deviceName || '';
      }
      if (node.children && node.children.length > 0) {
        flatten(node.children);
      }
    }
  };

  if (treeData && treeData.length > 0) {
    flatten(treeData);
  }

  return result;
};

/**
 * 使用扁平化映射快速查找设备名称
 * @param deviceCode 设备代码
 * @param deviceMap 扁平化的设备映射
 * @returns 设备名称，如果找不到返回空字符串
 */
export const getDeviceNameFromMap = (deviceCode: string, deviceMap: Record<string, string>): string => {
  return deviceMap[deviceCode] || '';
};

/**
 * 获取设备树中所有的叶子节点（最底层设备）
 * @param treeData 设备树数据
 * @returns 叶子节点数组
 */
export const getLeafDevices = (treeData: any[]): any[] => {
  const result: any[] = [];

  const findLeaves = (nodes: any[]) => {
    for (const node of nodes) {
      if (!node.children || node.children.length === 0) {
        // 没有子节点的就是叶子节点
        result.push(node);
      } else {
        findLeaves(node.children);
      }
    }
  };

  if (treeData && treeData.length > 0) {
    findLeaves(treeData);
  }

  return result;
};

export default {
  getDeviceNameByCode,
  getDeviceInfoByCode,
  flattenDeviceTree,
  getDeviceNameFromMap,
  getLeafDevices
};
